The xentrace_format script doesn't work on x86/64. Python pads the input
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 18 Nov 2005 16:54:23 +0000 (17:54 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 18 Nov 2005 16:54:23 +0000 (17:54 +0100)
structure because the first field is 32 bits and the next is 64 bits,
whereas x86-32 doesn't pad. The quick fix is to read the cpu id
separately as a 32bit value, then read the rest of the trace record.
Here is a little patch that does that. Tested on x86/32 SMP and x86/64.

Signed-off-by: Rob Gardner <rob.gardner@hp.com>
tools/xentrace/xentrace_format

index 82b406afe68e7553695cb613f1ce5d81b76f47d5..827680b95e964b3bf4896e95c48101009b20c129 100644 (file)
@@ -85,7 +85,9 @@ defs = read_defs(arg[0])
 
 # structure of trace record + prepended CPU id (as output by xentrace):
 # CPU(I) TSC(Q) EVENT(L) D1(L) D2(L) D3(L) D4(L) D5(L)
-TRCREC = "IQLLLLLL"
+# read CPU id separately to avoid structure packing problems on 64-bit arch.
+CPUREC = "I"
+TRCREC = "QLLLLLL"
 
 last_tsc = [0,0,0,0,0,0,0,0]
 
@@ -94,11 +96,16 @@ i=0
 while not interrupted:
     try:
        i=i+1
+        line = sys.stdin.read(struct.calcsize(CPUREC))
+        if not line:
+            break
+        cpu = struct.unpack(CPUREC, line)[0]
+
         line = sys.stdin.read(struct.calcsize(TRCREC))
         if not line:
             break
 
-        (cpu, tsc, event, d1, d2, d3, d4, d5) = struct.unpack(TRCREC, line)
+        (tsc, event, d1, d2, d3, d4, d5) = struct.unpack(TRCREC, line)
 
        #tsc = (tscH<<32) | tscL